/**
 * 
 */
package com.licg.chatroom.action;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringEscapeUtils;
import org.directwebremoting.Browser;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.ScriptSessionFilter;
import org.directwebremoting.ScriptSessions;
import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;

import com.licg.chatroom.dwrextents.CoustemDefaultScriptSessionManager;

/**
 * @author li_cguang
 * 
 */
public class ChatRoom {
	/**
	 * 登录
	 */
	public static String login(String username, String password)
			throws ServletException, IOException {
		// 用户登陆
		System.out.println(username);
		System.out.println(password);
		HttpSession session = getWebContext().getSession();
		session.setAttribute("username", username);
//		loginAllUsers(username);

		// // 将用户名信息放到map中//用户接收的到的消息bean
		// Map<String, List<MessageBean>> rMap = new ConcurrentHashMap<String,
		// List<MessageBean>>();
		// allUserRMap.put(username, rMap);
		// 如果用户还未登录，记录到list中
		if (!allUserList.contains(username)) {
			allUserList.add(username);
		}
		// 将用户上线信息，发送给客户端
		loginUsers(username);
		return "success";
	}

	/**
	 * 注销
	 */
	public static String logout() throws ServletException, IOException {
		HttpSession session = getWebContext().getSession();
		String username = (String) session.getAttribute("username");
		System.out.println("用户：" + username + "注销");
		session.removeAttribute("username");
		// allUserRMap.remove(username);
		// allUserVMap.remove(event.getValue());
		// 如果用户已经登录，从list中删除
		if (allUserList.contains(username)) {
			allUserList.remove(username);
		}
		//将保存的ScriptSession信息删除
		if(CoustemDefaultScriptSessionManager.userNameScriptSessions.containsKey(username)){
			CoustemDefaultScriptSessionManager.userNameScriptSessions.remove(username);
	   }
		session.invalidate();
		// 将用户下线信息，发送给客户端
		logoutUsers(username);
		return "success";

	}

	/**
	 * 获取当前用户信息
	 * 
	 * @param request
	 * @param response
	 */
	public static String getUserInfo() {
		HttpSession session = getWebContext().getSession();
		String username = (String) session.getAttribute("username");
		System.out.println("用户：" + username + "信息获取");
		if (username == null) {
			// 将用户未登录的信息返回给页面
			return "nouser";
		} else {
			return username;
		}
	}

	/**
	 * 用户上线时，获得所有登录用户信息
	 * @return 
	 */
	public static List<String> getAllUsers() {
		return allUserList;
	}
	/**
	 * 有用户登陆时候调用,不对自己登录的页面使用
	 */
	public static void loginUsers(final String loginUserName) {
		String page = getWebContext().getContextPath() + "/index.html";
		Browser.withPage(page, new Runnable() {
			public void run() {
				ScriptSessions.addFunctionCall("loginUsers", loginUserName);
			}
		});
	}
	/**
	 * 有用户下线时候调用
	 */
	public static void logoutUsers(final String loginUserName) {
		String page = getWebContext().getContextPath() + "/index.html";
		Browser.withPage(page, new Runnable() {
			public void run() {
				ScriptSessions.addFunctionCall("logoutUsers", loginUserName);
			}
		});
	}
	/**
	 * 添加消息到页面
	 * @param author
	 * @param toUserName
	 * @param message
	 */
	public static void receviceMessage(final String author,
			final String toUserName, final String message) {
		String page = getWebContext().getContextPath() + "/index.html";
		Browser.withPageFiltered(page, new ScriptSessionFilter() {
			public boolean match(ScriptSession scriptSession) {
				Object usernameObj = scriptSession.getAttribute("username");
				if (usernameObj != null) {
					//如果是作者 或者消息接受者
					if (author.equals(usernameObj)||toUserName.equals(usernameObj)) {
						return true;
					}
				}
				return false;
			}
		}, new Runnable() {
			public void run() {
				ScriptSessions.addFunctionCall("appendMessage", toUserName,
						author, getNowStringDate(), message);
			}
		});
	}

	public static String sendMessage(String toUserName, String message) {
		// // 具体消息bean
		// MessageBean messageBean = new MessageBean();
		// messageBean.setTime("时间:" + getNowStringDate());
		// messageBean.setMessage("信息:" + htmlChangeWithBR(message));
		// 消息作者
		String authorName = (String) getWebContext().getSession().getAttribute(
				"username");
		// 获得发送到的用户的Map
		// Map<String, List<MessageBean>> rMap = allUserRMap.get(toUserName);
		// 说明这个接收消息的用户是登陆状态
		if (allUserList.contains(toUserName)) {
			// List<MessageBean> rList = rMap.get(authorName);
			// // 如果还未创建消息列表则创建
			// if (rList == null) {
			// rList = new CopyOnWriteArrayList<MessageBean>();
			// }
			// rList.add(messageBean);
			// rMap.put(authorName, rList);
			receviceMessage(authorName, toUserName, message);
			return "success";
		} else {
			// 如果对方未登陆
			// 将用户未登录的信息返回给页面
			return "nouser";
		}
		// //将自己发布的消息放到已经看到过的消息列表
		// List<MessageBean> vList=allUserVMap.get(toUserName);
		// vList.add(messageBean);

	}

	/**
	 * 存储所有用户 ---------------用户名称列表
	 */
	public static final List<String> allUserList = new CopyOnWriteArrayList<String>();

	//
	// /**
	// * 存储所有用户 ---------------收到的还未看到的过的消息 map(用户名，用户消息Map（发送消息者，接收到的消息list）);
	// */
	// public static final Map<String, Map<String, List<MessageBean>>>
	// allUserRMap = new ConcurrentHashMap<String, Map<String,
	// List<MessageBean>>>();

	// /**
	// *存储所有用户 ---------------已经看过的消息
	// */
	// public static final Map<String,List<MessageBean>> allUserVMap=new
	// ConcurrentHashMap<String,List<MessageBean>>();

	/**
	 * 将string转化为html格式字符StringEscapeUtils这个工具类不能转换\n -> <br/>
	 * 
	 * @param message
	 * @return
	 */
	public static String htmlChangeWithBR(String message) {
		return changToBR(StringEscapeUtils.escapeHtml(message));
	}

	/**
	 * 将string中\n转化为<br/>
	 * 
	 * @param str
	 * @return
	 */
	public static String changToBR(String str) {
		return str.replaceAll("\n", "<br/>");
	}

	/**
	 * 获得当前string类型的格式化后的日期
	 * 
	 * @return
	 */
	public static String getNowStringDate() {
		return getStringDate(new Date());
	}

	/**
	 * 获得格式化的日期
	 * 
	 * @param date
	 * @return
	 */
	public static String getStringDate(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sdf.format(date);
	}

	/**
	 * 获得dwr中 WebContext对象
	 * 
	 * @return
	 */
	public static WebContext getWebContext() {
		return WebContextFactory.get();
	}
}
